Android SurfaceTexture
从图像流(Image Stream)中捕获帧(Frames)作为 OpenGL ES 的纹理(Texture)[1]。
图像流(Image Stream):图像流是一连串图像的集合。想象观看一部电影,实际上看到的是由许多静态图像(帧,Frames)组成的序列,这些帧以足够快的速度播放,以创建连续移动的效果。在技术上,图像流可以来源于多种设备或数据源,比如摄像头捕捉的实时视频或者存储在文件中的视频数据。
纹理(Texture):在图形编程中,纹理用于给图形对象添加细节和视觉效果。可以将纹理想象为一张贴在物体表面的图像,这张图像定义了物体的外观,如颜色、图案和其他视觉效果。在3D图形中,纹理使得简单模型看起来更加复杂和真实。
OpenGL ES:是一种用于渲染2D和3D图形的编程接口(API),特别适用于移动设备、游戏机和嵌入式设备。它定义了一套函数,让开发者能够在屏幕上绘制各种图形和纹理。从而创建具有复杂渲染效果的图形应用程序,而不需要了解底层硬件的复杂性
将上述概念联系起来,Android 的 SurfaceTexture 提供了一种高效的方法,通过 OpenGL ES 将图像流中的帧捕获并作为纹理渲染。这意味着,您可以将来自摄像头、视频文件或其他图像流的帧直接渲染到OpenGL环境中,而不需要进行复杂的数据转换或处理。这样做的好处是能够实现高性能和低延迟的图像处理和显示,非常适合需要实时视频处理的应用,比如视频聊天、增强现实(AR)应用等。
SurfaceTexture 通过创建一个可以接收图像流帧的表面(Surface),然后将这些帧作为纹理传递给OpenGL ES进行渲染。开发者可以利用OpenGL ES的强大渲染能力,对这些帧进行各种图形效果的处理,如滤镜、图像变换等。
整体流程
参考《Android图形系统之SurfaceTexture》[2]:
graph LR Canvas --> Surface[Surface
BufferQueue Producer] OpenGL --> Surface Decorder --> Surface Surface --> SurfaceTexture[SurfaceTexture
BufferQueueCore GLConsumer] SurfaceTexture --> OES[OES纹理] OES --> TextureView OES --> 纹理加工
- 生成图像流:来源:OpenGL、摄像头、视频解码
- 图像流传入 Surface
- 存入 BufferQueue 队列
- GLConsumer 消化队列,转为纹理
- 对纹理进行使用(特效、上屏)
创建 SurfaceTexture
使用如下代码可创建 SurfaceTexture:
new SurfaceTexture(textureId);
其中,textureId
(纹理 id)是一个与 OpenGL ES 纹理对象关联的整数标识符。在 OpenGL ES 中,纹理是一种可以被应用到 3D 对象上以创建表面细节的图像。每个纹理都有一个唯一的 ID(即 textureId
),用于在 OpenGL ES 的渲染过程中引用和操作这个纹理。当你创建一个 SurfaceTexture
实例时,需要提供一个 textureId
,这个 textureId
指向一个已经由 OpenGL ES 环境创建和初始化的纹理。
网络资源
本文作者:Maeiee
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!